//封装axios
import axios from 'axios'
import { Loading } from 'element-ui';
// 导入进度条
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
// 导入vuex信息
import store from '@/store/index'
// 获取token
// 导入router
import router from '@/router/index'
// 单独引入组件
import { Message } from 'element-ui'
// 创建axios实例，并添加请求的默认根路径(将根路径导出，方便其他组件直接用)
export const baseURL = 'http://big-event-vue-api-t.itheima.net'
const request = axios.create({
  baseURL: baseURL,
  timeout: 5000
})
let loadingInstance = null
// 请求拦截
// config: 每次发送请求时配置项里的内容（携带的参数、地址、请求方式
request.interceptors.request.use(config => {
  nprogress.start()
  loadingInstance = Loading.service({ fullscreen: true })
  // 除了登录页和注册页不需要携带token，其他页面都需要，因此在这里判断后将token添加在配置项里，API文件里的接口就不用每次发起请求都携带token了
  if (store.getters.login) {
    config.headers.Authorization = store.getters.login
  }
  return config
}, function (error) {
  return Promise.reject(error)
}
)
// 响应拦截
let itoken = true
request.interceptors.response.use(response => {
  loadingInstance.close()
  nprogress.done()
  return response
}, (error) => {
  if (error.response.status === 401) {//代表token过期
    // 防抖
    if (itoken) {
      //  需要清除vuex里的token和用户信息,不能直接改state里的值，因此调用mutations里的方法
      store.commit('updateUserInfo', '')
      store.commit('getToken', '')
      // 跳转回
      router.push('/login')
      Message.error('身份过期了！请重新登录')
      location.reload()
      itoken = false
      setTimeout(() => {
        itoken = true
      }, 1000)
    }
  }
  return Promise.reject(error)
}
)
// 导出
export default request